package com.example.java_gobang.common;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.Alert;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

public class AutoTestUtils {

    public static ChromeDriver driver;
    public static ChromeDriver driver1;

    //单例模式
    public static ChromeDriver createDriver() {
        if (driver == null) {
            driver = new ChromeDriver();
           /*  版本为4的时候取消注释
           // 设置隐式等待时间为 1 秒
            driver.manage()          // 返回 WebDriver.Options 对象
                    .timeouts()        // 返回 WebDriver.Timeouts 对象
                    .implicitlyWait(Duration.ofMillis(1000));  // 设置隐式等待时间并返回 WebDriver.Timeouts 对象*/
            driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        }
        return driver;
    }
    public static ChromeDriver createDriver1() {
        if (driver1 == null) {
            driver1 = new ChromeDriver();
            driver1.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        }
        return driver1;
    }

    /*关闭驱动driver*/
    public void quit() {
        driver.quit();
        driver1.quit();
    }
    /*
    构造方法初始化传参需要链接
    子类直接继承父类构造方法 能够把url传进去
    (同名参数 就近原则)
     */
    public AutoTestUtils(String url) {
        /*//1. 打开浏览器 使用驱动来打开
        WebDriverManager.chromedriver().setup();
        //增加浏览器配置：创建驱动对象要强制指定允许访问所有的链接
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");//避免访问链接403*/

        ChromeDriver driver = createDriver();
        ChromeDriver driver1 = createDriver1();
        driver.get(url);
        driver1.get(url);
    }
    /*
    根据时间获取文件名和文件夹名称
     */
    public List<String> getTime() {
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyyMMdd-HH");
        SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSSS");
        String dirname = sim1.format(System.currentTimeMillis());
        String filename = sim2.format(System.currentTimeMillis());
        List<String> list = new ArrayList<>();
        list.add(dirname);
        list.add(filename);
        return list;
    }

    //等待弹窗时间5s 显示等待
    public void waitAlert() {
        //超时时间为5s
        WebDriverWait wait =new WebDriverWait(driver, 5);
        //显示等待对于alert更合适 隐式等待用于查找页面元素
        wait.until(ExpectedConditions.alertIsPresent());
    }

    /*给driver1用的*/
    public void waitAlert1() {
        //超时时间为5s
        WebDriverWait wait1 =new WebDriverWait(driver1, 5);
        //显示等待对于alert更合适 隐式等待用于查找页面元素
        wait1.until(ExpectedConditions.alertIsPresent());
    }


    /*检查alert弹出的文字警告是否正确*/
    public void checkAlertText(String alertMessage) {
        // 切换到alert
        Alert alert = driver.switchTo().alert();
        // 获取alert文本
        String alertText = alert.getText();
        System.out.println("alertText："+alertText);
        // 断言检查警告文本是否正确
        assert(alertText.equals(alertMessage));
    }

    /*
    获取屏幕截图，把所有的用例执行的结果保存下来
    根据方法名和时间命名屏幕截图
     */
    public void getScreenShot(String methodName) throws IOException {
        List<String> list = getTime();
        //现在在当前项目目录gobang下 使用./表示现在层级的目录
        // ./src/test/java/com/example/java_gobang/test/image/
        String filename = "./src/test/java/com/example/java_gobang/test/image/" +
                list.get(0) + "/"+ methodName + list.get(1) + ".png";
        File srcFile = driver.getScreenshotAs(OutputType.FILE);
        //把屏幕截图放到指定的位置
        FileUtils.copyFile(srcFile, new File(filename));
    }
    public void getScreenShot(String methodName, ChromeDriver driver) throws IOException {
        List<String> list = getTime();
        //现在在当前项目目录gobang下 使用./表示现在层级的目录
        // ./src/test/java/com/example/java_gobang/test/image/
        String filename = "./src/test/java/com/example/java_gobang/test/image/" +
                list.get(0) + "/"+ methodName + list.get(1) + ".png";
        File srcFile = driver.getScreenshotAs(OutputType.FILE);
        //把屏幕截图放到指定的位置
        FileUtils.copyFile(srcFile, new File(filename));
    }

    /*
    页面是否加载成功
     */
    void loadPageRight(){}

}
